요약

안드로이드 4대 컴포넌트는 앱을 구성하기 위해 필요한 4개의 요소(Activity, Service, Broadcast Receiver, Content Provider)를 의미한다. 각각의 컴포넌트는 다음과 같은 기능 역할을 담당하고 상황에 맞게 전부 사용된다.

  • Activity : 사용자와 상호작용을 담당
  • Service : 백그라운드에서 어떠한 작업을 처리하는 역할
  • Broadcast Receiver : OS로부터 각종 이벤트와 정보를 핸들링하는 역할
  • Content Provier : 각종 데이터를 관리하고 제공하는 역할

4대 컴포넌트의 등장

액티비티(Activity)

사용자와의 상호작용을 담당하는 화면 단위 컴포넌트입니다. 즉 UI 담당이라고 생각하면 편합니다. 앱을 실행하면 앱의 전체를 한 번에 호출하는 게 아닌 앱의 액티비티를 호출합니다. 액티비티는 생명주기 관련 메서드들을 재정의하여 원하는 기능을 구현할 수 있습니다.

예제 코드

class MainActivity : AppComparActivity() {
	override fun onCreate(savedInstanceState: Bundle?) {
		super.onCreate(savedInstanceState)
		setContentView(R.layout.activity_main)
	}
}

액티비티의 특징

  • 액티비티들은 인텐트(Intent)를 이용해서 서로 application의 액티비티를 호출할 수 있습니다.
  • 2개 이상의 액티비티는 동시에 display할 수 없습니다.
  • 1개 이상의 View에는 하나 이상의 액티비티가 존재합니다.
  • 액티비티 내에 프래그먼트를 추가하여 화면을 분할시킬 수 있습니다.

Note

  • Activity에 비니지스 로직 넣지 말기 X
  • onCreate()에 모든 로직 넣는 실수 금지 X
  • Navigation Component 사용해서 화면 이동 관리하기! O

Service

백그라운드에서 어떠한 작업을 처리하기 위해서 주요 사용하는 컴포넌트입니다.

예제 코드

class MyService : Service() {
	override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
		return START_STICKY
	}
	
	override fun onBind(intent: Intent?): IBinder? {
		return null
	}
}

서비스의 특징

  • UI 없음
  • 앱 종료 후에도 동작 가능

Note

  • Android 8+ Foreground Service 필수
  • Notification 없으면 죽음!
  • 단순한 작업은 Service 대신 WorkManager 사용(권장)
  • 무거운 작업 = Coroutine + Worker 조합

Broadcast Receiver

Broadcast Receiver는 안드로이드 OS로부터 각종 이벤트와 정보를 핸들링하는 컴포넌트이다.

예제 코드

class MyReceiver : BroadcastReceiver() {
	override fun onReceive(context: Context, intent: Intent) {
		if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
			Log.d("Receiver", "부팅 완료")
		}
	}
}

서비스 특징

  • UI 없음
  • 이벤트 기반 동작

Content Provider

Content Provider의 경우 각종 데이터를 관리하고 다른 앱 간 데이터 공유용 컴포넌트이다.

예제 코드

val cursor = contentResolver.query(
	ContactsContract.CommonDateKinds.Phone.CONTENT_URI,
	null,
	null,
	null,
	null
)

서비스 특징

  • CRUD 기반 데이터 접근
  • ContentResolver 통한 접근

Note

  • 내부 앱이면 굳이 ContentProvider 쓰지 말기
  • 외부 공유 필요할 때만 사용
  • 권한 설정 안 하면 데이터 유출 위험 있음!